/*******************************************************************************
 * Copyright (c) 2012, 2017 IBM Corp.
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * and Eclipse Distribution License v1.0 which accompany this distribution.
 *
 * The Eclipse Public License is available at
 *   http://www.eclipse.org/legal/epl-v10.html
 * and the Eclipse Distribution License is available at
 *   http://www.eclipse.org/org/documents/edl-v10.php.
 *
 * Contributors:
 *    Ian Craggs - initial contribution
 *******************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cJSON.h"
#include "MQTTClient.h"
#include <unistd.h>

#define ADDRESS "tcp://mqtt.yyzlab.com.cn:1883"
#define CLIENTID "metaServer"
#define TOPIC "2429295153/APP2AIOTSIM"
#define QOS 1
#define TIMEOUT 10000L

int main(int argc, char *argv[])
{
    MQTTClient client;
    MQTTClient_connectOptions conn_opts = MQTTClient_connectOptions_initializer;
    MQTTClient_message pubmsg = MQTTClient_message_initializer;
    MQTTClient_deliveryToken token;
    int rc;

    MQTTClient_create(&client, ADDRESS, CLIENTID,
                      MQTTCLIENT_PERSISTENCE_NONE, NULL);

    conn_opts.keepAliveInterval = 20;
    conn_opts.cleansession = 1;

    if ((rc = MQTTClient_connect(client, &conn_opts)) != MQTTCLIENT_SUCCESS)
    {
        printf("Failed to connect, return code %d\n", rc);
        exit(EXIT_FAILURE);
    }
    while ((rc = MQTTClient_connect(client, &conn_opts)) == MQTTCLIENT_SUCCESS)
    {
        printf("Client Connected\n");
        // 创建根节点
        cJSON *root = cJSON_CreateObject();
        // 创建节点

        cJSON *name = cJSON_CreateString("dxc");
        cJSON *age = cJSON_CreateNumber(18);
        cJSON *msg = cJSON_CreateString("true");
        // 把子节点添加到根节点上
        cJSON_AddItemToObject(root, "name", name);
        cJSON_AddItemToObject(root, "age", age);
        cJSON_AddItemToObject(root, "msg", msg);

        // cJSON *new_val = cJSON_CreateString("新值");
        // cJSON_ReplaceItemInObject(root, "msg", new_val);//将msg节点的值替换为true
        // 将上面的树结构转换成字符串
        char *p = cJSON_Print(root);

        pubmsg.payload = p;
        pubmsg.payloadlen = (int)strlen(p);
        pubmsg.qos = QOS;
        pubmsg.retained = 0;

        MQTTClient_publishMessage(client, TOPIC, &pubmsg, &token);
        // printf("Waiting for up to %d seconds for publication of %s\n"
        //         "on topic %s for client with ClientID: %s\n",
        //         (int)(TIMEOUT/1000), p, TOPIC, CLIENTID);

        rc = MQTTClient_waitForCompletion(client, token, TIMEOUT);
        //printf("Message with delivery token %d delivered\n", token);

        free(p);
        p = NULL;
        fflush(NULL);
        cJSON_Delete(root);
        root = NULL;
        sleep(1);
    }
    MQTTClient_disconnect(client, 10000);
    MQTTClient_destroy(&client);
    return rc;
}
